#!/bin/bash

set -e

function run {
    echo "----------------------------------------------------------------------"
    echo "Running $@"
    "$@"
    echo
}

function clean {
    if [ "$CI" = "true" ]; then
        rm -rf target/debug/examples
        rm -rf target/debug/incremental
    fi
    df -h || true
    du -sh target/debug/build/* || true
}

# Make sure the Tensorflow version in the -sys build script matches the one in
# the run-valgrind script.
version_build_script=`grep "const VERSION" tensorflow-sys/build.rs | sed 's|.*"\([^"]*\)";|\1|g'`
version_requirements=`grep "tensorflow\s*=" .github/workflows/requirements.txt | sed "s|.*== \(.*\)|\1|g"`
if [[ "${version_build_script}" != "${version_requirements}" ]]; then
    echo "ERROR: TensorFlow version specified in build script does not match the one in the"
    echo "       GitHub requirements."
    echo "       tensorflow-sys/build.rs: ${version_build_script}"
    echo "       .github/workflows/requirements.txt: ${version_requirements}"
    exit 1
fi

# Make sure the crate version matches the one in README.md.
version_tensorflow_crate=`grep "^version =" Cargo.toml | sed 's|.*= "\(.*\)"|\1|g'`
version_tensorflow_readme=`sed -En 's|tensorflow *= *"([^"]*)"|\1|p' < README.md`
version_tensorflow_readme2=`sed -En 's|tensorflow *= *\{ *version *= *"([^"]*)".*$|\1|p' < README.md`
if [[ "${version_tensorflow_crate}" != "${version_tensorflow_readme}" || \
          "${version_tensorflow_crate}" != "${version_tensorflow_readme2}" ]]; then
    echo "ERROR: tensorflow crate version does not match the ones in README.md."
    echo "       Cargo.toml: ${version_tensorflow_crate}"
    echo "       README.md: ${version_tensorflow_readme}"
    echo "       README.md: ${version_tensorflow_readme2}"
    exit 1
fi

# Make sure the crate version matches the one in README.md for tensorflow-sys.
version_tensorflow_sys_crate=`grep "^version =" tensorflow-sys/Cargo.toml | sed 's|.*= "\(.*\)"|\1|g'`
version_tensorflow_sys_readme=`sed -En 's|tensorflow-sys *= *\{ *version *= *"([^"]*)".*$|\1|p' < tensorflow-sys/README.md`
if [[ "${version_tensorflow_sys_crate}" != "${version_tensorflow_sys_readme}" ]]; then
    echo "ERROR: tensorflow-sys crate version does not match the one in README.md."
    echo "       Cargo.toml: ${version_tensorflow_sys_crate}"
    echo "       README.md: ${version_tensorflow_sys_readme}"
    exit 1
fi

# GitHub seems to choke on the large number of warnings from dependencies.
export RUSTFLAGS="-Awarnings"

# Legacy Keras required for now because Keras 3 requires exporting models as
# Keras format, which the C API can't read:
# https://github.com/tensorflow/tensorflow/issues/70514
TF_USE_LEGACY_KERAS=1 run python3 examples/mobilenetv3/create_model.py
run df -h
# TODO(#391): Re-enable: (cd test_resources/library && ./build-test-op)
run cargo fmt --all -- --check
clean
run cargo test -vv -j 2
clean
run cargo test -vv -j 2 --features eager
clean
run cargo test -vv -j 2 --features tensorflow_unstable
clean
run cargo test -vv -j 2 --features ndarray
clean
run cargo run --example regression
clean
run cargo run --example xor
clean
run cargo run --features tensorflow_unstable --example expressions
clean
run cargo run --features eager --example mobilenetv3
clean
run cargo doc --features experimental,tensorflow_unstable,ndarray,eager
clean
run cargo doc --features experimental,tensorflow_unstable,ndarray,eager,private-docs-rs
clean
# TODO(#66): Re-enable: (cd tensorflow-sys && cargo test -vv -j 1)
(cd tensorflow-sys && run cargo run --example multiplication && clean)
(cd tensorflow-sys && run cargo run --example tf_version && clean)
(cd tensorflow-sys && run cargo doc -vv && clean)

# run cargo clippy
# (cd tensorflow-sys && run cargo clippy)
# (cd tensorflow-op-codegen && run cargo clippy)
# (cd tensorflow-proto-codegen && run cargo clippy)
# (cd tensorflow-internal-macros && run cargo clippy)

for file in $(find . -name target -prune -o -name '*.rs' -print); do
    bad_deprecations="$(rustfmt --emit stdout --config max_width=1000 "$file" | grep '#\[deprecated' | grep -E -v '([^"\\]|\\.|"([^"\\]|\\.)*")*since' || true)"
    if [[ "${bad_deprecations}" != "" ]]; then
        echo "ERROR: #[deprecated] attribute(s) found with no 'since' key in $file:"
        echo "${bad_deprecations}"
        exit 1
    fi
    bad_deprecations="$(rustfmt --emit stdout --config max_width=1000 "$file" | grep '#\[deprecated' | grep -E -v '([^"\\]|\\.|"([^"\\]|\\.)*")*note' || true)"
    if [[ "${bad_deprecations}" != "" ]]; then
        echo "ERROR: #[deprecated] attribute(s) found with no 'note' key in $file:"
        echo "${bad_deprecations}"
        exit 1
    fi
done

df -h
du -sh target/debug/build/*
